package org.tankwar.model;

import org.tankwar.type.Direction;
import org.tankwar.util.GlobalUtil;
import org.tankwar.util.ImageUtil;
import org.tankwar.view.GamePanel;
import java.awt.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Bullets implements GameComponent{
    public static int speedX = 10;
    public static int speedY = 10; // 子弹的全局静态速度
    public static final int width = 10;
    public static final int length = 10;
    private int x, y;
    Direction direction;
    private boolean good; // 子弹是玩家坦克的还是敌方坦克的
    private boolean live = true;

    private GamePanel tc;
    private static final Map<String, Image> imageMap = new HashMap<String, Image>(); // 定义Map键值对，是不同方向对应不同的弹头
    static {
        // 不同方向的子弹
        Image[] bulletImages = new Image[]{ // 不同方向的子弹
                GlobalUtil.tk.getImage(Bullets.class.getResource(ImageUtil.BULLET_LEFT_IMAGE_URL)),

                GlobalUtil.tk.getImage(Bullets.class.getResource(ImageUtil.BULLET_UP_IMAGE_URL)),

                GlobalUtil.tk.getImage(Bullets.class.getResource(ImageUtil.BULLET_RIGHT_IMAGE_URL)),

                GlobalUtil.tk.getImage(Bullets.class.getResource(ImageUtil.BULLET_DOWN_IMAGE_URL)),
        };
        imageMap.put("L", bulletImages[0]); // 加入Map容器
        imageMap.put("U", bulletImages[1]);
        imageMap.put("R", bulletImages[2]);
        imageMap.put("D", bulletImages[3]);
    }
    public Bullets(int x, int y, Direction dir) { // 构造函数1，传递位置和方向
        this.x = x;
        this.y = y;
        this.direction = dir;
    }

    // 构造函数2，接受另外两个参数
    public Bullets(int x, int y, boolean good, Direction dir, GamePanel tc) {
        this(x, y, dir);
        this.good = good;
        this.tc = tc;
    }

    /**
     * 子弹的移动方法
     */
    private void move() {
        switch (direction) {
            case L:
                x -= speedX; // 子弹不断向左进攻
                break;

            case U: // 子弹不断向上进攻
                y -= speedY;
                break;

            case R:
                x += speedX; // 子弹不断向右进攻
                break;

            case D: // 子弹不断向下进攻
                y += speedY;
                break;

            case STOP: // 游戏暂停
                break;
        }
        if (x < 0 || y < 0 || x > GamePanel.PANEL_WIDTH || y > GamePanel.PANEL_HEIGHT) {
            live = false;
        }
    }

    @Override
    public void draw(Graphics g) {
        if (!live) {
            tc.bullets.remove(this);
            return;
        }

        switch (direction) { // 选择不同方向的子弹
            case L:
                g.drawImage(imageMap.get("L"), x, y, null);
                break;

            case U:
                g.drawImage(imageMap.get("U"), x, y, null);
                break;

            case R:
                g.drawImage(imageMap.get("R"), x, y, null);
                break;

            case D:
                g.drawImage(imageMap.get("D"), x, y, null);
                break;
        }
        move(); // 调用子弹move()函数
    }

    @Override
    public Rectangle getRect() {
        return new Rectangle(x, y, width, length);
    }
    public boolean isLive() { // 是否还活着
        return live;
    }
    public boolean hitTanks(List<Tank> tanks) {// 当子弹打到坦克时
        for (int i = 0; i < tanks.size(); i++) {
            if (hitTank(tanks.get(i))) { // 对每一辆坦克，调用hitTank
                return true;
            }
        }
        return false;
    }

    public boolean hitTank(Tank t) { // 当子弹打到坦克上
        // 子弹所占空间与坦克所占空间取交集
        if (this.live && this.getRect().intersects(t.getRect()) && t.isLive() && this.good != t.isGood()) {
            BombTank e = new BombTank(t.getX(), t.getY(), tc);
            tc.bombTanks.add(e);
            if (t.isGood()) {
                t.setLife(t.getLife() - 50); // 中一颗子弹寿命减少50，中4枪就死，总生命值200
                if (t.getLife() <= 0)
                    t.setLive(false); // 当寿命为0时，设置寿命为死亡状态
            } else {
                t.setLive(false);
            }
            this.live = false;
            return true; // 射击成功，返回true
        }
        return false; // 否则返回false
    }

    public boolean hitWall(BrickWall w) { // 子弹打到砖墙上
        if (this.live && this.getRect().intersects(w.getRect())) {
            this.live = false;
            this.tc.otherWall.remove(w); // 子弹打到CommonWall墙上时则移除此击中墙
            this.tc.homeWall.remove(w);
            return true;
        }
        return false;
    }

    public boolean hitWall(MetalWall w) { // 子弹打到金属墙上
        if (this.live && this.getRect().intersects(w.getRect())) {
            this.live = false;
            // this.tc.metalWall.remove(w); //子弹不能穿越金属墙
            return true;
        }
        return false;
    }

    public boolean hitHome() { // 当子弹打到大本营时
        // 修复bug3，当子弹是敌方坦克的才能攻击基地
        if (this.live && !this.good && this.getRect().intersects(tc.home.getRect())) {
            this.live = false;
            this.tc.home.setLive(false); // 当大本营接受一枪时就毁灭    可以考虑让大本营拥有血量，而不是一枪就毁灭
            return true;
        }
        return false;
    }
}
